﻿using BaoShouTang.DBModel;
using BaoShouTangServer.ApiServies;
using BaoShouTangServer.DTOModel;
using BaoShouTangServer.Models;
using BaoShouTangServer.Service;
using Microsoft.Win32;
using Newtonsoft.Json;
using NLog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using U8Login;


namespace BaoShouTangServer.Controllers
{
    public class BeiLiaoController : Controller
    {
        private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger();

        // GET: BeiLiao
        public ActionResult Index()
        {
            return View();
        }

        public JsonResult BeiLiaoList(Guid 发料流水guid)
        {
            Logger.Warn("接受到的发料流水guid：" + JsonConvert.SerializeObject(发料流水guid));
            string resp = "";
            string msg = "";
            string responseMsg = "";

            HttpData<List<DTOU8材料出库单导入结果>> httpData = new HttpData<List<DTOU8材料出库单导入结果>>();

            List<Z_任务单实际投入> z_任务单实际投入List = SqlSugarHelp.scope.Queryable<Z_任务单实际投入>().Where(it => it.发料流水guid == 发料流水guid).ToList();
            if (z_任务单实际投入List != null && z_任务单实际投入List.Count > 0)
            {
                foreach (var z_任务单实际投入 in z_任务单实际投入List)
                {
                    if (z_任务单实际投入.U8出库单id.HasValue == true)
                    {
                        rdrecords11 rdrecordS11 = SqlSugarHelp.scope.Queryable<rdrecords11>().Where(it => it.cDefine23 == z_任务单实际投入.实际投入guid.ToString()).First();
                        if (rdrecordS11 != null )
                        {
                            rdrecord11 rdrecord11 = SqlSugarHelp.scope.Queryable<rdrecord11>().Where(it => it.ID == rdrecordS11.ID).First();
                            httpData.msg = $"{z_任务单实际投入.投入物料编号}已经出库了，出库单号为{rdrecord11.cCode}.";
                            return Json(httpData);
                        }
                    }
                }
                //z_任务单实际投入List 按仓库分组
                var groupBy = z_任务单实际投入List.GroupBy(it => it.仓库编号);

                clsLogin clsLogin = LogInService.GetLogin(ref resp, ref msg);
                if (resp != "登陆成功")
                {
                    return Json(new { success = false, message = $"{msg}" });
                }

                //遍历分组
                foreach (var item in groupBy)
                {
                    //获取仓库编号
                    string 仓库编号 = item.Key;
                    //获取该仓库下的所有发料记录
                    List<Z_任务单实际投入> z_任务单实际投入ListBy仓库 = item.ToList();
                    //开始生成U8出库单
                    string 到货单接口返回result = "";
                    string rdrecord11Id = "";
                   bool result = rdrecord11Service.生成材料出库(clsLogin,z_任务单实际投入ListBy仓库,ref rdrecord11Id, ref 到货单接口返回result);
                    string 物料号 = string.Join(",",z_任务单实际投入ListBy仓库.Select(it => it.投入物料编号).ToArray());
                    if (result == true)
                    {
                        rdrecord11 rdrecord11已推送 = SqlSugarHelp.scope.Queryable<rdrecord11>().Where(it => it.ID == int.Parse(rdrecord11Id)).First();
                        foreach (var 任务单实际投入已推送 in z_任务单实际投入ListBy仓库)
                        {
                            任务单实际投入已推送.U8出库单id = int.Parse(rdrecord11Id);
                            任务单实际投入已推送.U8出库单号 = rdrecord11已推送.cCode;
                            任务单实际投入已推送.U8出库状态 = "出库成功";
                            任务单实际投入已推送.U8出库失败原因 = "";
                            任务单实际投入已推送.U8出库日期 = rdrecord11已推送.dDate;
                            //if (任务单实际投入已推送.投入物料规格 == "统货")
                            //{
                            //    // 找到下一个次序的逻辑
                            //    string 下一个统货拣货次数 = null;
                            //    bool 是最后一个 = rdrecord11Service.下一个统货拣货次数(任务单实际投入已推送.投入物料编号, 任务单实际投入已推送.统货拣货次数, ref 下一个统货拣货次数);


                            //    // 输出结果
                            //    if (是最后一个)
                            //    {
                            //        httpData.msg += 下一个统货拣货次数;
                            //    }
                            //    else
                            //    {
                            //        string sql = $@"update currentstock set cFree1 = '{下一个统货拣货次数}' where autoid = {任务单实际投入已推送.CurrentstockAutoID}";
                            //        int r更新统货次数 = SqlSugarHelp.scope.Ado.ExecuteCommand(sql);
                            //        if (r更新统货次数 > 0)
                            //        {
                            //            httpData.msg += "更新统货次数成功";
                            //        }
                            //        else
                            //        {
                            //            httpData.msg += "更新统货次数失败";
                            //        }
                            //    }
                            //}


                        }
                        httpData.msg += $@"{仓库编号}仓库：{物料号}出库成功。出库单号：{rdrecord11已推送.cCode}.";
                    }
                    else
                    {
                        foreach (var 任务单实际投入已推送 in z_任务单实际投入ListBy仓库)
                        {
                            任务单实际投入已推送.U8出库失败原因 = 到货单接口返回result;
                            任务单实际投入已推送.U8出库状态 = "出库失败";
                            httpData.msg += $@"{仓库编号}仓库：[{物料号}]出库失败,原因为:[{到货单接口返回result}].";
                        }
                         httpData.msg += $@"{仓库编号}仓库：[{物料号}]出库失败,原因为:[{到货单接口返回result}].";
                    }
                }
                int r = SqlSugarHelp.scope.Updateable(z_任务单实际投入List).ExecuteCommand();
            }

            return Json(httpData);
        }

        public JsonResult BeiLiao(Guid guid)
        {
            Logger.Warn("接受到的当行发料guid：" + JsonConvert.SerializeObject(guid));
            string resp = "";
            string msg = "";
            string responseMsg = "";

            HttpData<List<DTOU8材料出库单导入结果>> httpData = new HttpData<List<DTOU8材料出库单导入结果>>();

            List<Z_任务单实际投入> z_任务单实际投入List = SqlSugarHelp.scope.Queryable<Z_任务单实际投入>().Where(it => it.实际投入guid == guid).ToList();
            if (z_任务单实际投入List != null && z_任务单实际投入List.Count > 0)
            {
                foreach (var z_任务单实际投入 in z_任务单实际投入List)
                {
                    if (z_任务单实际投入.U8出库单id.HasValue == true)
                    {
                        rdrecords11 rdrecordS11 = SqlSugarHelp.scope.Queryable<rdrecords11>().Where(it => it.cDefine23 == z_任务单实际投入.实际投入guid.ToString()).First();
                        if (rdrecordS11 != null)
                        {
                            rdrecord11 rdrecord11 = SqlSugarHelp.scope.Queryable<rdrecord11>().Where(it => it.ID == rdrecordS11.ID).First();
                            httpData.msg = $"{z_任务单实际投入.投入物料编号}已经出库了，出库单号为{rdrecord11.cCode}";
                            return Json(httpData);
                        }
                    }
                }
                //z_任务单实际投入List 按仓库分组
                var groupBy = z_任务单实际投入List.GroupBy(it => it.仓库编号);

                clsLogin clsLogin = LogInService.GetLogin(ref resp, ref msg);
                if (resp != "登陆成功")
                {
                    return Json(new { success = false, message = $"{msg}" });
                }

                //遍历分组
                foreach (var item in groupBy)
                {
                    //获取仓库编号
                    string 仓库编号 = item.Key;
                    //获取该仓库下的所有发料记录
                    List<Z_任务单实际投入> z_任务单实际投入ListBy仓库 = item.ToList();
                    //开始生成U8出库单
                    string 到货单接口返回result = "";
                    string rdrecord11Id = "";
                    bool result = rdrecord11Service.生成材料出库(clsLogin, z_任务单实际投入ListBy仓库, ref rdrecord11Id, ref 到货单接口返回result);
                    string 物料号 = string.Join(",", z_任务单实际投入ListBy仓库.Select(it => it.投入物料编号).ToArray());
                    if (result == true)
                    {
                        rdrecord11 rdrecord11已推送 = SqlSugarHelp.scope.Queryable<rdrecord11>().Where(it => it.ID == int.Parse(rdrecord11Id)).First();
                        foreach (var 任务单实际投入已推送 in z_任务单实际投入ListBy仓库)
                        {
                            任务单实际投入已推送.U8出库单id = int.Parse(rdrecord11Id);
                            任务单实际投入已推送.U8出库单号 = rdrecord11已推送.cCode;
                            任务单实际投入已推送.U8出库状态 = "出库成功";
                            任务单实际投入已推送.U8出库失败原因 = "";
                            任务单实际投入已推送.U8出库日期 = rdrecord11已推送.dDate;
                            httpData.msg += $@"{仓库编号}仓库：{物料号}出库成功。出库单号：{rdrecord11已推送.cCode}.";


                            //if (任务单实际投入已推送.投入物料规格 == "统货")
                            //{
                            //    // 找到下一个次序的逻辑
                            //    string 下一个统货拣货次数 = null;
                            //    bool 是最后一个 = rdrecord11Service.下一个统货拣货次数(任务单实际投入已推送.投入物料编号, 任务单实际投入已推送.统货拣货次数, ref 下一个统货拣货次数);


                            //    // 输出结果
                            //    if (是最后一个)
                            //    {
                            //        httpData.msg += 下一个统货拣货次数;
                            //    }
                            //    else
                            //    {
                            //        string sql = $@"update currentstock set cFree1 = '{下一个统货拣货次数}' where autoid = {任务单实际投入已推送.CurrentstockAutoID}";
                            //        int r更新统货次数 = SqlSugarHelp.scope.Ado.ExecuteCommand(sql);
                            //        if (r更新统货次数 > 0)
                            //        {
                            //            httpData.msg += "更新统货次数成功";
                            //        }
                            //        else
                            //        {
                            //            httpData.msg += "更新统货次数失败";
                            //        }
                            //    }
                            //}
                        }
                    }
                    else
                    {
                        foreach (var 任务单实际投入已推送 in z_任务单实际投入ListBy仓库)
                        {
                            任务单实际投入已推送.U8出库失败原因 = 到货单接口返回result;
                            任务单实际投入已推送.U8出库状态 = "出库失败";
                            httpData.msg += $@"{仓库编号}仓库：[{物料号}]出库失败,原因为:[{到货单接口返回result}].";
                        }
                    }
                }
                int r = SqlSugarHelp.scope.Updateable(z_任务单实际投入List).ExecuteCommand();
            }
            else
            {
                httpData.msg = $"未能根据 实际投入guid:{guid}查询到任务单实际投入数据";
            }

            return Json(httpData);
        }
    }
}